package br.edu.universo.si.projeto2.infojob.server.persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.server.Database;

/**
 * Classe de persistência de Login.
 * @author Andrey A. de Oliveira
 */
public class PLogin
{

	/**
	 * Efetua login.
	 * @author Andrey A. de Oliveira
	 * @param conta
	 * @param senha
	 * @return BeanAssinante
	 * @throws ClassNotFoundException
	 * @throws Exception
	 */
	public static BeanAssinante login(final String conta, final String senha)
		throws ClassNotFoundException, Exception
	{
		Database database = Database.getInstance();

		String query = "SELECT * FROM infojob.tb_empresa_assinante WHERE conta = ? AND senha = md5(?); ";

		PreparedStatement pStmt = database.getPreparedStatement(query);
		pStmt.setString(1, conta);
		pStmt.setString(2, senha);

		ResultSet rs = pStmt.executeQuery();
			
		if (rs.next())
		{
			BeanEmpresaAssinante bEmpresaAssinante = new BeanEmpresaAssinante();
			
			bEmpresaAssinante.setId(rs.getInt("id"));
			bEmpresaAssinante.setConta(conta);
			bEmpresaAssinante.setSenha(senha);

			return bEmpresaAssinante;
			
		} else
		{
			query = "SELECT * FROM infojob.tb_profissional_assinante WHERE conta = ? AND senha = md5(?); ";
			pStmt = database.getPreparedStatement(query);

			pStmt.setString(1, conta);
			pStmt.setString(2, senha);
			
			rs = pStmt.executeQuery();
			
			if (rs.next())
			{
				BeanProfissionalAssinante bProfissionalAssinante = new BeanProfissionalAssinante();

				bProfissionalAssinante.setId(rs.getInt("id"));
				bProfissionalAssinante.setConta(conta);
				bProfissionalAssinante.setSenha(senha);
				
				return bProfissionalAssinante;
			}
		}

		return null;
	}

	/**
	 * Altera a senha de uma conta.
	 * @author Andrey A. de Oliveira
	 * @param conta
	 * @param senha
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void alterarSenha(String conta, String senha) throws ClassNotFoundException, SQLException
	{
		if (PLogin.isEmpresa(conta))
		{
			Database database = Database.getInstance();
			
			PreparedStatement pStmt = database.getPreparedStatement(
					"UPDATE infojob.tb_empresa_assinante SET senha = md5(?) WHERE conta = ?");

			pStmt.setString(1, senha);
			pStmt.setString(2, conta);
			
			pStmt.executeUpdate();
		} else
		{
			Database database = Database.getInstance();
			
			PreparedStatement pStmt = database.getPreparedStatement(
					"UPDATE infojob.tb_profissional_assinante SET senha = md5(?) WHERE conta = ?");

			pStmt.setString(1, senha);
			pStmt.setString(2, conta);

			pStmt.executeUpdate();
		}
	}

	/**
	 * Verifica se a conta é de uma empresa.
	 * @author Andrey A. de Oliveira
	 * @param conta
	 * @return boolean
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static boolean isEmpresa(String conta) throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();
		
		PreparedStatement pStmt = database.getPreparedStatement(
				"SELECT * FROM infojob.tb_empresa_assinante WHERE conta = ?; ");
		
		pStmt.setString(1, conta);

		ResultSet rs = pStmt.executeQuery();
		
		if (rs.next())
		{
			return true;
		}
		
		return false;
	}

	/**
	 * Verifica se a conta é de um profissional.
	 * @author Andrey A. de Oliveira
	 * @param conta
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static boolean isProfissional(String conta) throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();
		
		PreparedStatement pStmt = database.getPreparedStatement(
				"SELECT * FROM infojob.tb_profissional_assinante WHERE conta = ?; ");
		
		pStmt.setString(1, conta);

		ResultSet rs = pStmt.executeQuery();
		
		if (rs.next())
		{
			return true;
		}
		
		return false;		
	}
}